package com.jt.controller;

import com.alibaba.dubbo.config.annotation.Reference;
import com.jt.pojo.User;
import com.jt.service.DubboUserService;
import com.jt.service.HttpClientService;
import com.jt.util.CookieUtil;
import com.jt.vo.SysResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import redis.clients.jedis.JedisCluster;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;

@Controller
@RequestMapping("/user")
public class UserController {

    //使用常量定义cookie名称.
    private static final String JT_TICKET = "JT_TICKET";
    @Autowired
    private HttpClientService httpClientService;
    //为接口创建代理对象进行注入. 之后通过PRC访问服务生产者
    @Reference(check=false)
    private DubboUserService userService;
    @Autowired
    private JedisCluster jedisCluster;

    /**
     * 实现用户页面的通用跳转
     * url1: http://www.jt.com/user/login.html        login.jsp
     * url2: http://www.jt.com/user/register.html     register.jsp
     */
    @RequestMapping("/{moduleName}")
    public String moduleName(@PathVariable String moduleName){

        return moduleName;
    }

    /**
     * 完成HttpClient测试
     * 1.url地址: http://www.jt.com/user/findUserList
     * 2.请求参数: 无
     * 3.返回值结果: List<User>集合
     */
    @RequestMapping("/findUserList")
    @ResponseBody
    public List<User> findUserList(){

        return httpClientService.findUserList();
    }

    /**
     * 完成用户注册操作
     * 1.url地址:http://www.jt.com/user/doRegister
     * 2.参数:   password: admin123
     *           username: admin12332412341234
     *           phone: 13111112227
     * 3.返回值:  SysResult对象
     */
    @RequestMapping("/doRegister")
    @ResponseBody   //将返回值结果转化为JSON
    public SysResult saveUser(User user){

        userService.saveUser(user);
        return SysResult.success();
    }

    /**
     * 业务需求:
     *   实现用户单点登录操作
     *   1.url地址:http://www.jt.com/user/doLogin?r=0.43530970885614617
     *   2.请求参数:  username: asdasdfas
     *                password: asdfasdfa
     *   3.返回值结果: SysResult对象
     *
     * 实现Cookie数据存储
     *  1.获取用户名和密码进行数据校验
     *  2.获取后端的密钥信息  非空????
     *  3.如果一切正常,则将数据存储到Cookie中. 路径/有效期/共享问题
     *
     * 关于Cookie说明:
     *      1.cookie只能看到自己域名下的cookie   私有的.
     *      2.setPath说明
     *          setPath("/") 一般都是/  读取cookie权限的设定,根目录中的请求 读取cookie
     *          setPath("/user") url地址路径/user下时才能获取cookie信息.
     *          url1: http://www.jt.com/findUser;
     *          url2: http://www.jt.com/user/findUser;
     *
     */
    @RequestMapping("/doLogin")
    @ResponseBody
    public SysResult userLogin(User user, HttpServletResponse response){
        String ticket = userService.findUserByUP(user);
        if(!StringUtils.hasLength(ticket)){
            //如果数据为null则表示用户名和密码错误...
            return SysResult.fail();
        }

        //需要将数据保存到cookie中
        Cookie cookie = new Cookie("JT_TICKET", ticket);
        cookie.setPath("/");
        cookie.setMaxAge(7*24*60*60); //设定有效期 7天有效 单位秒
        cookie.setDomain("jt.com");   //主要域名中由jt.com则可以共享数据
        response.addCookie(cookie);   //将数据写入客户端
        return SysResult.success();
    }

    /**
     * 完成用户退出操作
     * 1.重定向到系统首页
     * 2.要求删除redis中的数据  K-V结构  先获取key
     * 3.动态获取Cookie中的数据
     * 4.删除Cookie中的数据
     * url地址: http://www.jt.com/user/logout.html
     *
     */
    @RequestMapping("/logout")
    public String logout(HttpServletRequest request,HttpServletResponse response){
        String ticket = CookieUtil.getCookieValue(request, JT_TICKET);
        if(StringUtils.hasLength(ticket)){
            //1.删除redis
            jedisCluster.del(ticket);
            //2.删除cookie
            CookieUtil.addCookie(response,JT_TICKET,
                    "", "/", "jt.com", 0);
        }
        return "redirect:/";



      /*Cookie[] cookies = request.getCookies();
      if(cookies !=null && cookies.length>0){
          for (Cookie cookie : cookies){
              if(JT_TICKET.equals(cookie.getName())){
                  String ticket = cookie.getValue();
                  //删除redis的数据
                  jedisCluster.del(ticket);
                  //删除cookie的数据
                  cookie.setMaxAge(0); //0 立即删除  -1 关闭浏览器之后删除
                  cookie.setPath("/");
                  cookie.setDomain("jt.com");
                  response.addCookie(cookie);
              }
          }
      }

        return "redirect:/";
        */
    }








}
